package top.zerozoo.learn.grade.util;

import java.lang.reflect.Method;

/**
 * 数字工具类
 *
 * @author Zerozoo
 */
public class NumberUtils {
    /**
     * 将字符串转换为任意数值类型
     * 该数值类型必须已经实现了valueOf方法
     * @param str 数值文本
     * @param type 数值类
     * @param defaultValue 转换失败后的默认值
     * @return转换后的数值
     * @throws NumberParseException
     */
    public static <T> T parse(String str, Class<T> type, T defaultValue) throws NumberParseException {
        T result = defaultValue;
        if(str == null || str.isEmpty()){
            return result;
        }
        try {
            Method method = type.getMethod("valueOf",String.class);
            result = (T) method.invoke(type.getClass(),str);
        } catch (NoSuchMethodException e) {
            throw new NumberParseException(type.getName() + " not exists parse method");
        } catch (Exception e) {

        }
        return result;
    }
    /**
     * 将字符串转换为任意数值类型，并且不能低于最小值，否则将会返回最小值
     * 该数值类型必须已经实现了valueOf方法并且实现了Comparable接口
     * @see Comparable
     * @param str 数值文本
     * @param type 数值类
     * @param min 转换后允许的最小值
     * @return 转换后的数值
     * @throws NumberParseException
     */
    public static <T> T parseLimited(String str, Class<T> type, T min) throws NumberParseException {
        T result = parse(str,type,min);
        Comparable comparable = (Comparable) result;
        if(comparable.compareTo(min)<0){
            result = min;
        }
        return result;
    }
}

class NumberParseException extends RuntimeException {
    public NumberParseException(String message) {
        super(message);
    }
}
